package com.ilongsay.controller;

import com.ilongsay.entity.AjaxObject;
import com.ilongsay.entity.FaPiao;
import com.ilongsay.entity.FaPiaoDetail;
import com.ilongsay.entity.Input;
import com.ilongsay.fapiao.FaPiaoService;
import com.ilongsay.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author ilongsay
 * @Email ilongsay@163.com
 * @Copyright 版本所有，侵权必究！
 * @Datetime 2018-11-17 18:46
 * @Describution 这里日后需要整理一下，将不同的位置的代码整理到不同的controller中
 */
@Controller
@RequestMapping("show")
public class BillController {

    @Autowired
    private IBillService billService;

    @Autowired
    private IBillSqliteService billSqliteService;

    @Autowired
    private IBillDetailService billDetailService;

    @Autowired
    private IBillDetailSqliteService billDetailSqliteService;

    @Autowired
    private IBillInputService billInputService;

    @Autowired
    private IConfirmSixService confirmSixService;

    @Autowired
    private IMergeService mergeService;

    @Autowired
    private FaPiaoService faPiaoService;



    //private static List<FaPiao> list;

    /**
     * @return java.lang.Object
     * 暂时不显示分页，分页效果不给力，不符合需求
     */
    @RequestMapping("/showBill")
    @ResponseBody
    public Object showBill() {

        //将数据封装为前端固定格式
        AjaxObject ajaxObject = new AjaxObject();
        List<FaPiao> sqliteBill = null;
        //将数据从sqlite中查询出来，以sqlite的数据为准
        try {

            //查询数据
            sqliteBill = billSqliteService.findBill();

        } catch (Exception e) {
            ajaxObject.setCode("1");
            e.printStackTrace();
            ajaxObject.setMsg("查询失败！"+e.toString());
            return ajaxObject;
        }
        //进行6分钱误差确定
        AjaxObject ajaxObject1 = confirmSixService.confirmSixError(sqliteBill);
        if (ajaxObject1.getCode().equals("0")) {
            ajaxObject.setCode("0");
            ajaxObject.setMsg("");
            ajaxObject.setData(sqliteBill);
        }else {
            ajaxObject = ajaxObject1;
        }
        confirmSixService.confirmRather(sqliteBill);//确定是否超过限额
        return ajaxObject;
    }

    /**
     * @param
     * @return java.lang.String
     * 全部导入数据，需要设定条件，按条件导入数据
     * 等按条件查询数据可以的话这里就报销了
     * //XXX：作废不用
     */
    @RequestMapping("/bill")
    public String bill() {

        //从数据源查询主表数据
        List<FaPiao> list1 = billService.findAllBill();

        //从数据源查询明细表数据
        List<FaPiaoDetail> billDetail = null;
        billDetail = billDetailService.findBillDetail();

        //插入sqlite数据库
        billDetailSqliteService.insertBillDetail(billDetail);

        billSqliteService.insertBill(list1);
        return "redirect:/bill/index";
    }

    /**
     * @param billCode 订单编号
     * @return java.lang.Object
     * 这里的数据日后会整合到service中，再配置好分布式的访问设置
     * 在客户安装运行私服的时候使用sqlite（这是64位的sqlite）
     * 日后在本地服务端运行的时候就使用mysql做成分布式
     */
    @RequestMapping("/billDetail")
    @ResponseBody
    public Object billDetail(@RequestParam("billCode") String billCode) {

        //List<FaPiaoDetail> billDetailByBillCode = billDetailService.findBillDetailByBillCode(billCode);
        //从sqlite中查询出数据，根据订单号
        List<FaPiaoDetail> billDetailByBillCode = billDetailSqliteService.findBillByBillCode(billCode);

        AjaxObject ajaxObject = new AjaxObject();
        ajaxObject.setData(billDetailByBillCode);
        ajaxObject.setCode("0");
        //ajaxObject.setMsg("");

        return ajaxObject;
    }

    /**
     * @param billCode 传入的订单号参数
     * @return java.lang.Object
     * 单据合并的代码的时候，先集成到controller，然后再集成到service中
     */
    @RequestMapping("/hebing")
    @ResponseBody
    public Object heBing(@RequestParam("billCode") String billCode) {

        return mergeService.mergeBillCode(billCode);
    }

    /**
     * @param input
     * @return java.lang.Object
     * 这里是提交input设置数据修改更新的，查询条件的代码
     */
    @RequestMapping("/input")
    @ResponseBody
    public Object input(Input input) {

        AjaxObject ajaxObject = new AjaxObject();
        input.setCustomName(input.getCustomName().replace(" ", ""));
        input.setBillCode(input.getBillCode().replace(" ", ""));
        //更新本地sqlite的设置
        try{
            billInputService.updateInput(input);
        }catch( Exception e ){
            e.printStackTrace();
            ajaxObject.setCode("1");
            ajaxObject.setMsg("保存查询数据失败，请检查sqlite数据库位置！");
            return ajaxObject;
        }finally{

        }

        //从数据源获取数据
        List<FaPiao> faPiaos = billService.findByParams(input);
        if (faPiaos.size()==0) {
            ajaxObject.setCode("1");
            ajaxObject.setMsg("查询单据为空，请检查查询条件！");
            return ajaxObject;
        }else {
            //插入本地的数据库主表和明细表，这里应该是一个事务，需要将数据集合在service中
            try {
                //ConfirmUtils.confirmAmount(faPiaos);//校验数据
                billSqliteService.insertBill(faPiaos);
                //faPiaoService.insertBill(faPiaos);
            } catch (Exception e) {
                e.printStackTrace();
                ajaxObject.setCode("1");
                ajaxObject.setMsg("插入数据失败，请检查是否多次导入相同的主表数据！");
                return ajaxObject;
            } finally {

            }
        }
        ajaxObject.setCode("0");
        return ajaxObject;
    }

    /**
     * @param
     * @return java.lang.Object
     * 这里是查询数据设置的回显
     */
    @ResponseBody
    @RequestMapping(value = "/findInput")
    public Object input() {
        Input input = billInputService.findInput();
        AjaxObject ajaxObject = new AjaxObject();
        ajaxObject.setCode("0");
        ajaxObject.setData(input);
        return ajaxObject;
    }

    /**
     * @param billCode
     * @return java.lang.Object
     * 全部删除数据
     * //TODO:需要将这个遍历明细单号的逻辑集合在service中
     */
    @ResponseBody
    @RequestMapping("/deletes")
    public Object deletes(@RequestParam("billCode") String billCode) {
        List<String> billCodes = new ArrayList<>();
        AjaxObject ajaxObject = new AjaxObject();
        String[] split = billCode.split("\\,");
        for (String s : split) {
            billCodes.add(s);
        }
        try{
            billSqliteService.deleteBills(billCodes);
        }catch( Exception e ){
            ajaxObject.setCode("1");
            e.printStackTrace();
            return ajaxObject;
        }finally{

        }

        ajaxObject.setCode("0");
        return ajaxObject;
    }
}
